import { useUserStore, useMenuStore } from '@/stores'
import { ElNotification } from 'element-plus'
import { asnycRoute, anyRoute } from '@/router/routes.js'
import { getFirstRoutePerms, getSecondRoutePerms, getRoutes } from '@/utils/common.js'
import router from '@/router/index.js'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

// 网站名称
const name = import.meta.env.VITE_APP_NAME

// 全局前置守卫
router.beforeEach(async (to, from) => {
  NProgress.start() // 开启进度条

  // 1.获取token
  const userStore = useUserStore()
  const token = userStore.user.token

  // 2.没有登录跳转回登录页
  if (!token && to.path !== '/login') {
    return '/login'
  }

  // 3.防止重复登录
  if (token && to.path === '/login') {
    ElNotification.error('请勿重复登录！')
    // 使用HTML5 模式无法获取from.path,使用Hash 模式则可以实现回退功能
    return from.path ? from.path : '/'
  }

  // 设置路由权限
  const menuStore = useMenuStore()
  if (!menuStore.isAddRoute && token) {
    // 1.获取用户权限信息
    const permission = userStore.user.permissions
    // 2. 筛选一级路由标识
    const firstRoutePerms = getFirstRoutePerms(permission)
    // 3. 筛选二级路由标识
    const secondRoutePerms = getSecondRoutePerms(permission)
    // 4.根据权限标识过滤路由表
    const routes = getRoutes(firstRoutePerms, secondRoutePerms, asnycRoute)
    // 5.1 addRoute动态添加
    routes.forEach((route) => router.addRoute(route))
    // 添加任意路由
    router.addRoute(anyRoute)
    // // 5.2 动态路由添加到vuex
    menuStore.setMenuList(routes)
    menuStore.setIsAddRoute(true)

    return to
  }

  // 设置页面标题
  document.title = to.meta.title ? to.meta.title + ' - ' + name : name
})

// 全局后置守卫
router.afterEach((to, from) => {
  NProgress.done() // 关闭进度条
})

export default router
